/*
	NounEnhancementBeam.cpp
	(c)2008 Palestar Inc, Jeff Everett
*/


#include "Debug/Assert.h"
#include "Constants.h"
#include "NounShip.h"
#include "NounPlanet.h"
#include "StructurePort.h"
#include "GameContext.h"
#include "NounEnhancementBeam.h"



// Minor Beam ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_MinorBeamAccelerator, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorBeamAccelerator, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorBeamAccelerator::NounEnhancement_MinorBeamAccelerator()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,5));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-5));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorBeamCooler, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorBeamCooler, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorBeamCooler::NounEnhancement_MinorBeamCooler()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,5));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,-5));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorBeamMultiplexer, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorBeamMultiplexer, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorBeamMultiplexer::NounEnhancement_MinorBeamMultiplexer()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,5));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,5));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorBeamCondenser, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorBeamCondenser, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorBeamCondenser::NounEnhancement_MinorBeamCondenser()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,-5));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,-5));
}

// Limited Beam ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_LimitedBeamAccelerator, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedBeamAccelerator, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedBeamAccelerator::NounEnhancement_LimitedBeamAccelerator()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,10));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-10));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedBeamCooler, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedBeamCooler, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedBeamCooler::NounEnhancement_LimitedBeamCooler()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,10));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,-10));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedBeamMultiplexer, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedBeamMultiplexer, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedBeamMultiplexer::NounEnhancement_LimitedBeamMultiplexer()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,10));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,10));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedBeamCondenser, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedBeamCondenser, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedBeamCondenser::NounEnhancement_LimitedBeamCondenser()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,-10));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,-10));
}

// Standard Beam ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_StandardBeamAccelerator, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardBeamAccelerator, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardBeamAccelerator::NounEnhancement_StandardBeamAccelerator()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,15));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-15));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardBeamCooler, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardBeamCooler, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardBeamCooler::NounEnhancement_StandardBeamCooler()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,15));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,-15));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardBeamMultiplexer, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardBeamMultiplexer, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardBeamMultiplexer::NounEnhancement_StandardBeamMultiplexer()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,15));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,15));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardBeamCondenser, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardBeamCondenser, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardBeamCondenser::NounEnhancement_StandardBeamCondenser()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,-15));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,-15));
}

// Improved Beam ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_ImprovedBeamAccelerator, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedBeamAccelerator, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedBeamAccelerator::NounEnhancement_ImprovedBeamAccelerator()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,20));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-20));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedBeamCooler, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedBeamCooler, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedBeamCooler::NounEnhancement_ImprovedBeamCooler()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,20));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,-20));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedBeamMultiplexer, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedBeamMultiplexer, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedBeamMultiplexer::NounEnhancement_ImprovedBeamMultiplexer()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,20));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,20));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedBeamCondenser, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedBeamCondenser, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedBeamCondenser::NounEnhancement_ImprovedBeamCondenser()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,-20));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,-20));
}

// Enhanced Beam ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_EnhancedBeamAccelerator, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedBeamAccelerator, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedBeamAccelerator::NounEnhancement_EnhancedBeamAccelerator()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,25));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-25));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedBeamCooler, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedBeamCooler, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedBeamCooler::NounEnhancement_EnhancedBeamCooler()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,25));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,-25));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedBeamMultiplexer, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedBeamMultiplexer, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedBeamMultiplexer::NounEnhancement_EnhancedBeamMultiplexer()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,25));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,25));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedBeamCondenser, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedBeamCondenser, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedBeamCondenser::NounEnhancement_EnhancedBeamCondenser()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,-25));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,-25));
}

// Advanced Beam ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_AdvancedBeamAccelerator, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedBeamAccelerator, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedBeamAccelerator::NounEnhancement_AdvancedBeamAccelerator()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,30));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-30));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedBeamCooler, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedBeamCooler, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedBeamCooler::NounEnhancement_AdvancedBeamCooler()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,30));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_RANGE,-30));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedBeamMultiplexer, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedBeamMultiplexer, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedBeamMultiplexer::NounEnhancement_AdvancedBeamMultiplexer()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,30));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,30));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedBeamCondenser, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedBeamCondenser, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedBeamCondenser::NounEnhancement_AdvancedBeamCondenser()
{
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_ENERGY,-30));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_COOLDOWN,-30));
}



